package dfl.bysj.service.impl;

import cn.hutool.core.date.DateTime;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.*;
import dfl.bysj.config.OssProperties;
import dfl.bysj.service.FileService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.servlet.ServletOutputStream;
import java.io.*;
import java.util.UUID;

@Slf4j
@Service
public class FileServiceImpl implements FileService {

    /**
     * 文件上传至阿里云
     */
    @Override
    public String upload(InputStream inputStream, String module, String fileName) {

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(
                OssProperties.ENDPOINT,
                OssProperties.KEY_ID,
                OssProperties.KEY_SECRET);
        //判断oss实例是否存在：如果不存在则创建，如果存在则获取
        if (!ossClient.doesBucketExist(OssProperties.BUCKET_NAME)) {
            //创建bucket
            ossClient.createBucket(OssProperties.BUCKET_NAME);
            //设置oss实例的访问权限：公共读
            ossClient.setBucketAcl(OssProperties.BUCKET_NAME, CannedAccessControlList.PublicRead);
        }

        //构建日期路径：avatar/2019/02/26/文件名
//        String folder = new DateTime().toString("yyyy/MM/dd");

        //文件名：uuid.扩展名
//        fileName = UUID.randomUUID().toString() + fileName.substring(fileName.lastIndexOf("."));
        //文件根路径
        String key = module + "/"  + fileName+".png";

        //文件上传至阿里云
        ossClient.putObject(OssProperties.BUCKET_NAME, key, inputStream);

        // 关闭OSSClient。
        ossClient.shutdown();

        //阿里云文件绝对路径
        return "https://" + OssProperties.BUCKET_NAME + "." + OssProperties.ENDPOINT + "/" + key;
    }

    /**
     * 根据路径删除文件
     *
     * @param url
     */
    @Override
    public void removeFile(String url) {

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(
                OssProperties.ENDPOINT,
                OssProperties.KEY_ID,
                OssProperties.KEY_SECRET);

        //文件名（服务器上的文件路径）
        String host = "https://" + OssProperties.BUCKET_NAME + "." + OssProperties.ENDPOINT + "/";
        String objectName = url.substring(host.length());

        // 删除文件。
        ossClient.deleteObject(OssProperties.BUCKET_NAME, objectName);

        // 关闭OSSClient。
        ossClient.shutdown();
    }

    /**
     * 从OSS服务器下载到本地
     */
    @Override
    public void download(ServletOutputStream outputStream, String module) {
//
//        // 创建OSSClient实例。
//        OSS ossClient = new OSSClientBuilder().build(
//                OssProperties.ENDPOINT,
//                OssProperties.KEY_ID,
//                OssProperties.KEY_SECRET);
//
//        boolean flag;
//        String marker = "";
//        do {
//            ListObjectsRequest lor = new ListObjectsRequest();
//            //指定目录
//            lor.setPrefix(prefix);
//            lor.setBucketName(OssProperties.BUCKET_NAME);
//            //
//            lor.setMarker(marker);
//            //分页大小
//            lor.setMaxKeys(100);
//            ObjectListing ol = ossClient.listObjects(lor);
//            for (OSSObjectSummary o : ol.getObjectSummaries()) {
//                System.out.println(" - " + o.getKey() + "  " + "(size = " + o.getSize() + ")");
//                //
//                final String path = directoryPath + o.getKey();
//                //获取文件对象
//                GetObjectRequest gor = new GetObjectRequest("ecars", o.getKey());
//                //截取目录 如果目录不存在则创建
//                String directoryStr = path.substring(0, path.lastIndexOf("/"));
//                File directory = new File(directoryStr);
//                if (!directory.exists()) {
//                    directory.mkdirs();
//                }
//                //获取文件流  使用高速缓存 + 数组复制 最大效率输出文件
//                try {
//                    BufferedInputStream bis = new BufferedInputStream(ossClient.getObject(gor).getObjectContent());
//                    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(path))){
//                        int size;
//                        byte[] bytes = new byte[1024];
//                        while ((size = bis.read(bytes)) != -1) {
//                            bos.write(bytes, 0, size);
//                        }
//                        bos.flush();
//                    }
//                }catch (Exception e){
//                    throw  new RuntimeException();
//                }
//                //当前页的最后一个文件
//                marker = ol.getNextMarker();
//                //是否还有文件
//                flag = ol.isTruncated();
//
//            } while (flag) ;
//
//            ossClient.shutdown();
        }

    @Override
    public OSSObject downloadOssFile(ServletOutputStream outputStream, String fName) {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(
                OssProperties.ENDPOINT,
                OssProperties.KEY_ID,
                OssProperties.KEY_SECRET);
        log.info(ossClient.toString());
        // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
        OSSObject ossObject = ossClient.getObject(new GetObjectRequest(OssProperties.BUCKET_NAME, fName));
        return ossObject;

    }
}